package vue;

import controller.ApplicationController;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import java.awt.Color;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.TreeMap;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

public class VueYams extends JFrame {

    /**
     * Constantes des boutons
     */
    public final static String BTN_FR = "FR";
    public final static String BTN_EN = "EN";
    public final static String BTN_LANCER = "LANCER";
    public final static String BTN_DE1 = "DE_1";
    public final static String BTN_DE2 = "DE_2";
    public final static String BTN_DE3 = "DE_3";
    public final static String BTN_DE4 = "DE_4";
    public final static String BTN_DE5 = "DE_5";
    public final static String BTN_SCORE_1 = "SCORE_1";
    public final static String BTN_SCORE_2 = "SCORE_2";
    public final static String BTN_SCORE_3 = "SCORE_3";
    public final static String BTN_SCORE_4 = "SCORE_4";
    public final static String BTN_SCORE_5 = "SCORE_5";
    public final static String BTN_SCORE_6 = "SCORE_6";
    public final static String BTN_SCORE_BRELAN = "SCORE_BRELAN";
    public final static String BTN_SCORE_CARRE = "SCORE_CARRE";
    public final static String BTN_SCORE_FULL = "SCORE_FULL";
    public final static String BTN_SCORE_PSUITE = "SCORE_PSUITE";
    public final static String BTN_SCORE_GSUITE = "SCORE_GSUITE";
    public final static String BTN_SCORE_YAMS = "SCORE_YAMS";
    public final static String BTN_SCORE_CHANCE = "SCORE_CHANCE";
    /**
     * Constantes pour les couleurs des joueurs
     */
    public final static Color COULEUR_JOUEUR_ATTENTE = Color.BLACK;
    public final static Color COULEUR_JOUEUR_ACTIF = Color.RED;
    public final static int JOUEUR_1 = 1;
    public final static int JOUEUR_2 = 2;
    /**
     * Panel principal
     */
    private PanelYams pnl_Principal;
    /**
     * bundle pour récupérer les messages dans la langue souhaitée
     */
    private static ResourceBundle bundle;

    /**
     * Les composants 
     */
    private JPanel pnl_Des, pnl_Combinaison, pnl_Joueur, pnl_Langues; //Panels
    private JButton btn_EN, btn_FR; //Langues de l'application
    private JButtonDe btn_De1, btn_De2, btn_De3, btn_De4, btn_De5;//Dés
    private JButton btn_As, btn_Deux, btn_Trois, btn_Quatre, btn_Cinq, btn_Six; //Combinaisons simple
    private JButton btn_Brelan, btn_Carre, btn_Full, btn_PetiteSuite, btn_GrandeSuite, btn_Yams, btn_Chance; //Combinaisons complexes
    private JButton btn_LancerDes; //Lancer les dés
    private JLabel lbl_As, lbl_Deux, lbl_Trois, lbl_Quatre, lbl_Cinq, lbl_Six;
    private JLabel lbl_Brelan, lbl_Carre, lbl_Full, lbl_PetiteSuite, lbl_GrandeSuite, lbl_Yams, lbl_Chance;
    private JLabel lbl_Joueur1, lbl_Joueur2, lbl_ScoreJoueur1, lbl_ScoreJoueur2, lbl_LancersRestants, lbl_NbLancersRestants;
    private List<JButtonDe> listBoutonDes;
    //Map qui contient pour un codeJoueur, les boutons de score qu'il a déja appuyé
    private Map<Integer, List<JButton>> boutonsUtilParJoueur;
    private final ArrayList<JButton> listBoutonScore;
    //Noms des joueurs 
    private String nomJ1, nomJ2;

    private class PanelYams extends JPanel {

        public PanelYams() {

            setTitle("Yams");
            setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
            setBounds(100, 100, 914, 477);
            setBorder(new EmptyBorder(5, 5, 5, 5));
            GridBagLayout gbl_contentPane = new GridBagLayout();
            gbl_contentPane.columnWidths = new int[]{0, 0};
            gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0, 0, 74, 0, 0};
            gbl_contentPane.columnWeights = new double[]{1.0, Double.MIN_VALUE};
            gbl_contentPane.rowWeights = new double[]{0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, Double.MIN_VALUE};
            setLayout(gbl_contentPane);

            pnl_Des = new JPanel();
            pnl_Des.setOpaque(false);
            GridBagConstraints gbc_pnl_Des = new GridBagConstraints();
            gbc_pnl_Des.insets = new Insets(0, 0, 5, 0);
            gbc_pnl_Des.fill = GridBagConstraints.BOTH;
            gbc_pnl_Des.gridx = 0;
            gbc_pnl_Des.gridy = 1;
            add(pnl_Des, gbc_pnl_Des);
            GridBagLayout gbl_pnl_Des = new GridBagLayout();
            gbl_pnl_Des.columnWidths = new int[]{0, 0, 0, 0, 0, 0};
            gbl_pnl_Des.rowHeights = new int[]{0, 0};
            gbl_pnl_Des.columnWeights = new double[]{1.0, 1.0, 1.0, 1.0, 1.0, Double.MIN_VALUE};
            gbl_pnl_Des.rowWeights = new double[]{1.0, Double.MIN_VALUE};
            pnl_Des.setLayout(gbl_pnl_Des);

            GridBagConstraints gbc_btn_De1 = new GridBagConstraints();
            gbc_btn_De1.insets = new Insets(0, 0, 0, 5);
            gbc_btn_De1.gridx = 0;
            gbc_btn_De1.gridy = 0;
            pnl_Des.add(btn_De1, gbc_btn_De1);

            GridBagConstraints gbc_btn_De2 = new GridBagConstraints();
            gbc_btn_De2.insets = new Insets(0, 0, 0, 5);
            gbc_btn_De2.gridx = 1;
            gbc_btn_De2.gridy = 0;
            pnl_Des.add(btn_De2, gbc_btn_De2);

            GridBagConstraints gbc_btn_De3 = new GridBagConstraints();
            gbc_btn_De3.insets = new Insets(0, 0, 0, 5);
            gbc_btn_De3.gridx = 2;
            gbc_btn_De3.gridy = 0;
            pnl_Des.add(btn_De3, gbc_btn_De3);

            GridBagConstraints gbc_btn_De4 = new GridBagConstraints();
            gbc_btn_De4.insets = new Insets(0, 0, 0, 5);
            gbc_btn_De4.gridx = 3;
            gbc_btn_De4.gridy = 0;
            pnl_Des.add(btn_De4, gbc_btn_De4);

            GridBagConstraints gbc_btn_De5 = new GridBagConstraints();
            gbc_btn_De5.gridx = 4;
            gbc_btn_De5.gridy = 0;
            pnl_Des.add(btn_De5, gbc_btn_De5);

            pnl_Combinaison = new JPanel();
            pnl_Combinaison.setOpaque(false);
            GridBagConstraints gbc_pnl_Combinaison = new GridBagConstraints();
            gbc_pnl_Combinaison.insets = new Insets(0, 0, 5, 0);
            gbc_pnl_Combinaison.fill = GridBagConstraints.BOTH;
            gbc_pnl_Combinaison.gridx = 0;
            gbc_pnl_Combinaison.gridy = 3;
            add(pnl_Combinaison, gbc_pnl_Combinaison);
            GridBagLayout gbl_pnl_Combinaison = new GridBagLayout();
            gbl_pnl_Combinaison.columnWidths = new int[]{143, 21, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0};
            gbl_pnl_Combinaison.rowHeights = new int[]{0, 28, 0, 41, 0, 0, 0};
            gbl_pnl_Combinaison.columnWeights = new double[]{1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, Double.MIN_VALUE};
            gbl_pnl_Combinaison.rowWeights = new double[]{1.0, 1.0, 1.0, 1.0, 1.0, 1.0, Double.MIN_VALUE};
            pnl_Combinaison.setLayout(gbl_pnl_Combinaison);

            GridBagConstraints gbc_btn_As = new GridBagConstraints();
            gbc_btn_As.insets = new Insets(0, 0, 5, 5);
            gbc_btn_As.gridx = 0;
            gbc_btn_As.gridy = 0;
            pnl_Combinaison.add(btn_As, gbc_btn_As);

            GridBagConstraints gbc_btn_Deux = new GridBagConstraints();
            gbc_btn_Deux.insets = new Insets(0, 0, 5, 5);
            gbc_btn_Deux.gridx = 2;
            gbc_btn_Deux.gridy = 0;
            pnl_Combinaison.add(btn_Deux, gbc_btn_Deux);

            GridBagConstraints gbc_btn_Trois = new GridBagConstraints();
            gbc_btn_Trois.insets = new Insets(0, 0, 5, 5);
            gbc_btn_Trois.gridx = 4;
            gbc_btn_Trois.gridy = 0;
            pnl_Combinaison.add(btn_Trois, gbc_btn_Trois);

            GridBagConstraints gbc_btn_Quatre = new GridBagConstraints();
            gbc_btn_Quatre.insets = new Insets(0, 0, 5, 5);
            gbc_btn_Quatre.gridx = 6;
            gbc_btn_Quatre.gridy = 0;
            pnl_Combinaison.add(btn_Quatre, gbc_btn_Quatre);

            GridBagConstraints gbc_btn_Cinq = new GridBagConstraints();
            gbc_btn_Cinq.insets = new Insets(0, 0, 5, 5);
            gbc_btn_Cinq.gridx = 8;
            gbc_btn_Cinq.gridy = 0;
            pnl_Combinaison.add(btn_Cinq, gbc_btn_Cinq);

            GridBagConstraints gbc_btn_Six = new GridBagConstraints();
            gbc_btn_Six.insets = new Insets(0, 0, 5, 0);
            gbc_btn_Six.gridx = 10;
            gbc_btn_Six.gridy = 0;
            pnl_Combinaison.add(btn_Six, gbc_btn_Six);

            GridBagConstraints gbc_lbl_As = new GridBagConstraints();
            gbc_lbl_As.insets = new Insets(0, 0, 5, 5);
            gbc_lbl_As.gridx = 0;
            gbc_lbl_As.gridy = 1;
            pnl_Combinaison.add(lbl_As, gbc_lbl_As);

            GridBagConstraints gbc_lbl_Deux = new GridBagConstraints();
            gbc_lbl_Deux.insets = new Insets(0, 0, 5, 5);
            gbc_lbl_Deux.gridx = 2;
            gbc_lbl_Deux.gridy = 1;
            pnl_Combinaison.add(lbl_Deux, gbc_lbl_Deux);

            GridBagConstraints gbc_lbl_Trois = new GridBagConstraints();
            gbc_lbl_Trois.insets = new Insets(0, 0, 5, 5);
            gbc_lbl_Trois.gridx = 4;
            gbc_lbl_Trois.gridy = 1;
            pnl_Combinaison.add(lbl_Trois, gbc_lbl_Trois);

            GridBagConstraints gbc_lbl_Quatre = new GridBagConstraints();
            gbc_lbl_Quatre.insets = new Insets(0, 0, 5, 5);
            gbc_lbl_Quatre.gridx = 6;
            gbc_lbl_Quatre.gridy = 1;
            pnl_Combinaison.add(lbl_Quatre, gbc_lbl_Quatre);

            GridBagConstraints gbc_lbl_Cinq = new GridBagConstraints();
            gbc_lbl_Cinq.insets = new Insets(0, 0, 5, 5);
            gbc_lbl_Cinq.gridx = 8;
            gbc_lbl_Cinq.gridy = 1;
            pnl_Combinaison.add(lbl_Cinq, gbc_lbl_Cinq);

            GridBagConstraints gbc_lbl_Six = new GridBagConstraints();
            gbc_lbl_Six.insets = new Insets(0, 0, 5, 0);
            gbc_lbl_Six.gridx = 10;
            gbc_lbl_Six.gridy = 1;
            pnl_Combinaison.add(lbl_Six, gbc_lbl_Six);

            GridBagConstraints gbc_btn_Brelan = new GridBagConstraints();
            gbc_btn_Brelan.insets = new Insets(0, 0, 5, 5);
            gbc_btn_Brelan.gridx = 0;
            gbc_btn_Brelan.gridy = 2;
            pnl_Combinaison.add(btn_Brelan, gbc_btn_Brelan);

            GridBagConstraints gbc_btn_Carre = new GridBagConstraints();
            gbc_btn_Carre.insets = new Insets(0, 0, 5, 5);
            gbc_btn_Carre.gridx = 2;
            gbc_btn_Carre.gridy = 2;
            pnl_Combinaison.add(btn_Carre, gbc_btn_Carre);

            GridBagConstraints gbc_btn_Full = new GridBagConstraints();
            gbc_btn_Full.insets = new Insets(0, 0, 5, 5);
            gbc_btn_Full.gridx = 4;
            gbc_btn_Full.gridy = 2;
            pnl_Combinaison.add(btn_Full, gbc_btn_Full);

            GridBagConstraints gbc_btn_PetiteSuite = new GridBagConstraints();
            gbc_btn_PetiteSuite.insets = new Insets(0, 0, 5, 5);
            gbc_btn_PetiteSuite.gridx = 6;
            gbc_btn_PetiteSuite.gridy = 2;
            pnl_Combinaison.add(btn_PetiteSuite, gbc_btn_PetiteSuite);

            GridBagConstraints gbc_btn_GrandeSuite = new GridBagConstraints();
            gbc_btn_GrandeSuite.insets = new Insets(0, 0, 5, 5);
            gbc_btn_GrandeSuite.gridx = 8;
            gbc_btn_GrandeSuite.gridy = 2;
            pnl_Combinaison.add(btn_GrandeSuite, gbc_btn_GrandeSuite);

            GridBagConstraints gbc_btn_Chance = new GridBagConstraints();
            gbc_btn_Chance.insets = new Insets(0, 0, 5, 0);
            gbc_btn_Chance.gridx = 10;
            gbc_btn_Chance.gridy = 2;
            pnl_Combinaison.add(btn_Chance, gbc_btn_Chance);

            GridBagConstraints gbc_lbl_Brelan = new GridBagConstraints();
            gbc_lbl_Brelan.insets = new Insets(0, 0, 5, 5);
            gbc_lbl_Brelan.gridx = 0;
            gbc_lbl_Brelan.gridy = 3;
            pnl_Combinaison.add(lbl_Brelan, gbc_lbl_Brelan);

            GridBagConstraints gbc_lbl_Carre = new GridBagConstraints();
            gbc_lbl_Carre.insets = new Insets(0, 0, 5, 5);
            gbc_lbl_Carre.gridx = 2;
            gbc_lbl_Carre.gridy = 3;
            pnl_Combinaison.add(lbl_Carre, gbc_lbl_Carre);

            GridBagConstraints gbc_lbl_Full = new GridBagConstraints();
            gbc_lbl_Full.insets = new Insets(0, 0, 5, 5);
            gbc_lbl_Full.gridx = 4;
            gbc_lbl_Full.gridy = 3;
            pnl_Combinaison.add(lbl_Full, gbc_lbl_Full);

            GridBagConstraints gbc_lbl_PetiteSuite = new GridBagConstraints();
            gbc_lbl_PetiteSuite.insets = new Insets(0, 0, 5, 5);
            gbc_lbl_PetiteSuite.gridx = 6;
            gbc_lbl_PetiteSuite.gridy = 3;
            pnl_Combinaison.add(lbl_PetiteSuite, gbc_lbl_PetiteSuite);

            GridBagConstraints gbc_lbl_GrandeSuite = new GridBagConstraints();
            gbc_lbl_GrandeSuite.insets = new Insets(0, 0, 5, 5);
            gbc_lbl_GrandeSuite.gridx = 8;
            gbc_lbl_GrandeSuite.gridy = 3;
            pnl_Combinaison.add(lbl_GrandeSuite, gbc_lbl_GrandeSuite);

            GridBagConstraints gbc_lbl_Chance = new GridBagConstraints();
            gbc_lbl_Chance.insets = new Insets(0, 0, 5, 0);
            gbc_lbl_Chance.gridx = 10;
            gbc_lbl_Chance.gridy = 3;
            pnl_Combinaison.add(lbl_Chance, gbc_lbl_Chance);

            GridBagConstraints gbc_btn_Yams = new GridBagConstraints();
            gbc_btn_Yams.fill = GridBagConstraints.HORIZONTAL;
            gbc_btn_Yams.gridwidth = 4;
            gbc_btn_Yams.insets = new Insets(0, 0, 5, 0);
            gbc_btn_Yams.gridx = 3;
            gbc_btn_Yams.gridy = 4;
            pnl_Combinaison.add(btn_Yams, gbc_btn_Yams);

            GridBagConstraints gbc_lbl_Yams = new GridBagConstraints();
            gbc_lbl_Yams.gridwidth = 4;
            gbc_lbl_Yams.gridx = 3;
            gbc_lbl_Yams.gridy = 5;
            pnl_Combinaison.add(lbl_Yams, gbc_lbl_Yams);

            pnl_Joueur = new JPanel();
            pnl_Joueur.setOpaque(false);
            GridBagConstraints gbc_pnl_Joueur = new GridBagConstraints();
            gbc_pnl_Joueur.insets = new Insets(0, 0, 5, 0);
            gbc_pnl_Joueur.fill = GridBagConstraints.BOTH;
            gbc_pnl_Joueur.gridx = 0;
            gbc_pnl_Joueur.gridy = 5;
            add(pnl_Joueur, gbc_pnl_Joueur);
            GridBagLayout gbl_pnl_Joueur = new GridBagLayout();
            gbl_pnl_Joueur.columnWidths = new int[]{0, 0, 0, 0, 0, 0};
            gbl_pnl_Joueur.rowHeights = new int[]{0, 0, 0};
            gbl_pnl_Joueur.columnWeights = new double[]{1.0, 0.0, 0.0, 1.0, 1.0, Double.MIN_VALUE};
            gbl_pnl_Joueur.rowWeights = new double[]{1.0, 1.0, Double.MIN_VALUE};
            pnl_Joueur.setLayout(gbl_pnl_Joueur);

            lbl_Joueur1.setForeground(COULEUR_JOUEUR_ACTIF);
            GridBagConstraints gbc_lblJoueur1 = new GridBagConstraints();
            gbc_lblJoueur1.anchor = GridBagConstraints.EAST;
            gbc_lblJoueur1.insets = new Insets(0, 0, 5, 5);
            gbc_lblJoueur1.gridx = 0;
            gbc_lblJoueur1.gridy = 0;
            pnl_Joueur.add(lbl_Joueur1, gbc_lblJoueur1);

            lbl_ScoreJoueur1.setForeground(COULEUR_JOUEUR_ACTIF);
            GridBagConstraints gbc_lbl_ScoreJoueur1 = new GridBagConstraints();
            gbc_lbl_ScoreJoueur1.insets = new Insets(0, 0, 5, 5);
            gbc_lbl_ScoreJoueur1.gridx = 1;
            gbc_lbl_ScoreJoueur1.gridy = 0;
            pnl_Joueur.add(lbl_ScoreJoueur1, gbc_lbl_ScoreJoueur1);

            GridBagConstraints gbc_btn_LancerDes = new GridBagConstraints();
            gbc_btn_LancerDes.gridwidth = 2;
            gbc_btn_LancerDes.insets = new Insets(0, 0, 5, 0);
            gbc_btn_LancerDes.gridx = 3;
            gbc_btn_LancerDes.gridy = 0;
            pnl_Joueur.add(btn_LancerDes, gbc_btn_LancerDes);

            lbl_Joueur2.setForeground(COULEUR_JOUEUR_ATTENTE);
            GridBagConstraints gbc_lbl_Joueur2 = new GridBagConstraints();
            gbc_lbl_Joueur2.anchor = GridBagConstraints.EAST;
            gbc_lbl_Joueur2.insets = new Insets(0, 0, 0, 5);
            gbc_lbl_Joueur2.gridx = 0;
            gbc_lbl_Joueur2.gridy = 1;
            pnl_Joueur.add(lbl_Joueur2, gbc_lbl_Joueur2);

            lbl_ScoreJoueur2.setForeground(COULEUR_JOUEUR_ATTENTE);
            GridBagConstraints gbc_lbl_ScoreJoueur2 = new GridBagConstraints();
            gbc_lbl_ScoreJoueur2.insets = new Insets(0, 0, 0, 5);
            gbc_lbl_ScoreJoueur2.gridx = 1;
            gbc_lbl_ScoreJoueur2.gridy = 1;
            pnl_Joueur.add(lbl_ScoreJoueur2, gbc_lbl_ScoreJoueur2);

            lbl_LancersRestants = new JLabel(bundle.getString("lancers_restants"));
            GridBagConstraints gbc_lbl_LancersRestants = new GridBagConstraints();
            gbc_lbl_LancersRestants.anchor = GridBagConstraints.EAST;
            gbc_lbl_LancersRestants.insets = new Insets(0, 0, 0, 5);
            gbc_lbl_LancersRestants.gridx = 3;
            gbc_lbl_LancersRestants.gridy = 1;
            pnl_Joueur.add(lbl_LancersRestants, gbc_lbl_LancersRestants);

            GridBagConstraints gbc_lbl_NbLancersRestants = new GridBagConstraints();
            gbc_lbl_NbLancersRestants.anchor = GridBagConstraints.WEST;
            gbc_lbl_NbLancersRestants.gridx = 4;
            gbc_lbl_NbLancersRestants.gridy = 1;
            pnl_Joueur.add(lbl_NbLancersRestants, gbc_lbl_NbLancersRestants);

            pnl_Langues = new JPanel();
            pnl_Langues.setOpaque(false);
            GridBagConstraints gbc_pnl_Langues = new GridBagConstraints();
            gbc_pnl_Langues.anchor = GridBagConstraints.BASELINE;
            gbc_pnl_Langues.fill = GridBagConstraints.BOTH;
            gbc_pnl_Langues.gridx = 0;
            gbc_pnl_Langues.gridy = 6;
            add(pnl_Langues, gbc_pnl_Langues);

            btn_FR.setBorderPainted(false);
            btn_FR.setContentAreaFilled(false);
            btn_FR.setIcon(new ImageIcon(cheminCompletFichier("Flag-of-France-32.png")));
            pnl_Langues.add(btn_FR);

            btn_EN.setBorderPainted(false);
            btn_EN.setContentAreaFilled(false);
            btn_EN.setIcon(new ImageIcon(cheminCompletFichier("flagUK.png")));
            pnl_Langues.add(btn_EN);
        }

        /**
         * Méthode qui permet d'afficher un fond d'écran
         */
//        @Override
//        protected void paintComponent(Graphics g) {
//            super.paintComponent(g);
//            Image img = new ImageIcon(cheminCompletFichier("yahtzee1680.jpg")).getImage();
//            if (img == null) {
//                return;
//            }
//            g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
//
//        }
    }

    /**
     * Cree la vue principale
     */
    public VueYams(Locale locale, String nomJoueur1, String nomJoueur2) {

        //initialisation du bundle
        bundle = ResourceBundle.getBundle("international.international", locale);
        //set du locale
        setLocale(locale);

        nomJ1 = nomJoueur1;
        nomJ2 = nomJoueur2;

        /**
         * Instanciation des composants 
         */
        
        listBoutonDes = new ArrayList<JButtonDe>();
        listBoutonScore = new ArrayList<JButton>();
        boutonsUtilParJoueur = new TreeMap<Integer, List<JButton>>();
        boutonsUtilParJoueur.put(JOUEUR_1, new ArrayList<JButton>());
        boutonsUtilParJoueur.put(JOUEUR_2, new ArrayList<JButton>());

        btn_De1 = new JButtonDe();
        btn_De2 = new JButtonDe();
        btn_De3 = new JButtonDe();
        btn_De4 = new JButtonDe();
        btn_De5 = new JButtonDe();

        //On modifie les boutons afin qu'ils n'affichent que l'image sans
        //les bordures du bouton
        btn_De1.setVisible(false);
        btn_De1.setBorderPainted(false);
        btn_De1.setContentAreaFilled(false);
        btn_De2.setVisible(false);
        btn_De2.setBorderPainted(false);
        btn_De2.setContentAreaFilled(false);
        btn_De3.setVisible(false);
        btn_De3.setBorderPainted(false);
        btn_De3.setContentAreaFilled(false);
        btn_De4.setVisible(false);
        btn_De4.setBorderPainted(false);
        btn_De4.setContentAreaFilled(false);
        btn_De5.setVisible(false);
        btn_De5.setBorderPainted(false);
        btn_De5.setContentAreaFilled(false);

        //Affectation des actionCommands
        btn_De1.setActionCommand(BTN_DE1);
        btn_De2.setActionCommand(BTN_DE2);
        btn_De3.setActionCommand(BTN_DE3);
        btn_De4.setActionCommand(BTN_DE4);
        btn_De5.setActionCommand(BTN_DE5);

        btn_FR = new JButton();
        btn_EN = new JButton();

        //Récupération des libéllés des boutons grâce aux
        //fichiers .properties
        btn_LancerDes = new JButton(bundle.getString("lancer"));
        btn_As = new JButton(bundle.getString("as"));
        btn_Deux = new JButton(bundle.getString("deux"));
        btn_Trois = new JButton(bundle.getString("trois"));
        btn_Quatre = new JButton(bundle.getString("quatre"));
        btn_Cinq = new JButton(bundle.getString("cinq"));
        btn_Six = new JButton(bundle.getString("six"));
        btn_Brelan = new JButton(bundle.getString("brelan"));
        btn_Carre = new JButton(bundle.getString("carre"));
        btn_Full = new JButton(bundle.getString("full"));
        btn_PetiteSuite = new JButton(bundle.getString("p_suite"));
        btn_GrandeSuite = new JButton(bundle.getString("g_suite"));
        btn_Chance = new JButton(bundle.getString("chance"));
        btn_Yams = new JButton(bundle.getString("yams"));

        lbl_As = new JLabel();
        lbl_Deux = new JLabel();
        lbl_Trois = new JLabel();
        lbl_Quatre = new JLabel();
        lbl_Cinq = new JLabel();
        lbl_Six = new JLabel();
        lbl_Brelan = new JLabel();
        lbl_Carre = new JLabel();
        lbl_Full = new JLabel();
        lbl_PetiteSuite = new JLabel();
        lbl_GrandeSuite = new JLabel();
        lbl_Chance = new JLabel();
        lbl_Yams = new JLabel();

        lbl_Joueur1 = new JLabel(nomJoueur1 + " : ");
        lbl_Joueur2 = new JLabel(nomJoueur2 + " : ");
        lbl_ScoreJoueur1 = new JLabel("0");
        lbl_ScoreJoueur2 = new JLabel("0");

        //Definition des actionCommands pour les boutons
        //de sélection des combinaisons
        btn_As.setActionCommand(BTN_SCORE_1);
        btn_Deux.setActionCommand(BTN_SCORE_2);
        btn_Trois.setActionCommand(BTN_SCORE_3);
        btn_Quatre.setActionCommand(BTN_SCORE_4);
        btn_Cinq.setActionCommand(BTN_SCORE_5);
        btn_Six.setActionCommand(BTN_SCORE_6);
        btn_Brelan.setActionCommand(BTN_SCORE_BRELAN);
        btn_Carre.setActionCommand(BTN_SCORE_CARRE);
        btn_Full.setActionCommand(BTN_SCORE_FULL);
        btn_PetiteSuite.setActionCommand(BTN_SCORE_PSUITE);
        btn_GrandeSuite.setActionCommand(BTN_SCORE_GSUITE);
        btn_Chance.setActionCommand(BTN_SCORE_CHANCE);
        btn_Yams.setActionCommand(BTN_SCORE_YAMS);
        btn_LancerDes.setActionCommand(BTN_LANCER);

        btn_FR.setActionCommand(BTN_FR);
        btn_EN.setActionCommand(BTN_EN);

        //On ajoute les dés à l'array liste
        listBoutonDes.add(btn_De1);
        listBoutonDes.add(btn_De2);
        listBoutonDes.add(btn_De3);
        listBoutonDes.add(btn_De4);
        listBoutonDes.add(btn_De5);

        listBoutonScore.add(btn_As);
        listBoutonScore.add(btn_Deux);
        listBoutonScore.add(btn_Trois);
        listBoutonScore.add(btn_Quatre);
        listBoutonScore.add(btn_Cinq);
        listBoutonScore.add(btn_Six);
        listBoutonScore.add(btn_Brelan);
        listBoutonScore.add(btn_Carre);
        listBoutonScore.add(btn_Full);
        listBoutonScore.add(btn_PetiteSuite);
        listBoutonScore.add(btn_GrandeSuite);
        listBoutonScore.add(btn_Chance);
        listBoutonScore.add(btn_Yams);

        lbl_NbLancersRestants = new JLabel("3");

        pnl_Principal = new PanelYams();
        setContentPane(pnl_Principal);
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        setExtendedState(getExtendedState() | MAXIMIZED_BOTH);
    }


    public static ResourceBundle getBundle() {
        return bundle;
    }

    /**
     * M̩thode qui permet à la frame de s'abonner à un Controller
     *
     * @param <tt>ControllerAnagramme</tt> ctrl le controller aupr̬s duquel on
     *        s'abonne
     */
    public void abonnementAUnListener(ApplicationController ctrl) {
        btn_FR.addActionListener(ctrl);
        btn_EN.addActionListener(ctrl);
        btn_LancerDes.addActionListener(ctrl);
        for (JButton jb : listBoutonDes) {
            jb.addActionListener(ctrl);
        }
        for (JButton jbs : listBoutonScore) {
            jbs.addActionListener(ctrl);
        }
        this.addWindowListener(ctrl);
    }

    public void setLangueApplication(Locale locale) {
        // On vérifie si on a selectionn̩ une langue diff̩rente de la langue
        // actuelle.
        if (!bundle.getLocale().equals(locale)) {
            setLocale(locale);
            // on récupere le bundle correspondant a la nouvelle locale
            bundle = ResourceBundle.getBundle("international.international",
                    locale);

            // On modifie tous les champs pour qu'il prennent
            // la langue s̩lectionn̩e
            btn_Yams.setText(bundle.getString("combi_ultime"));
            btn_LancerDes.setText(bundle.getString("lancer"));
            btn_As.setText(bundle.getString("as"));
            btn_Deux.setText(bundle.getString("deux"));
            btn_Trois.setText(bundle.getString("trois"));
            btn_Quatre.setText(bundle.getString("quatre"));
            btn_Cinq.setText(bundle.getString("cinq"));
            btn_Six.setText(bundle.getString("six"));
            btn_Brelan.setText(bundle.getString("brelan"));
            btn_Carre.setText(bundle.getString("carre"));
            btn_Full.setText(bundle.getString("full"));
            btn_PetiteSuite.setText(bundle.getString("p_suite"));
            btn_GrandeSuite.setText(bundle.getString("g_suite"));
            btn_Yams.setText(bundle.getString("yams"));
            btn_Chance.setText(bundle.getString("chance"));
            lbl_LancersRestants.setText(bundle.getString("lancers_restants"));

        }
    }

    /**
     * Méthode qui permet d'afficher la valeur des dés en affectant à chaque
     * boutons la valeur correspondante dans la liste pass�e en param�tre
     * @param list la liste de valeur des d�s
     */
    public void afficheDes(List<Integer> list) {
        int cpt = 1;
        ImageIcon img;
        //Si c'est le joueur n'a rien lancer on fait apparaitre les d�s
        if (getNbPermiLance() == 3) {
            for (JButtonDe jb : listBoutonDes) {
                jb.setVisible(true);
            }
        }
        for (Integer i : list) {
            img = new ImageIcon(directoryDes() + i + ".png");
            switch (cpt) {
                case 1:
                    btn_De1.setIcon(img);
                    btn_De1.setValeur(i);
                    break;
                case 2:
                    btn_De2.setIcon(img);
                    btn_De2.setValeur(i);
                    break;
                case 3:
                    btn_De3.setIcon(img);
                    btn_De3.setValeur(i);
                    break;
                case 4:
                    btn_De4.setIcon(img);
                    btn_De4.setValeur(i);
                    break;
                case 5:
                    btn_De5.setIcon(img);
                    btn_De5.setValeur(i);
                    break;
                default:
                    //TODO: lancer une exception dans le default
                    break;
            }
            cpt++;
        }
        Integer nbLance = Integer.parseInt(lbl_NbLancersRestants.getText());
        lbl_NbLancersRestants.setText(String.valueOf(--nbLance));
    }

    /**
     * Retourne le nombre contenu dans le label destiné à afficher le nombre de
     * lancers restants
     * @return
     */
    private int getNbPermiLance() {
        return Integer.parseInt(lbl_NbLancersRestants.getText());
    }

    /**
     * Permet de griser le bouton dont l'action command correspond.
     * @param ac
     */
    public void verrouilleBouton(String ac) {
        for (JButton jb : listBoutonDes) {
            if (jb.getActionCommand().equals(ac)) {
                jb.setBorderPainted(true);
                jb.setFocusPainted(true);
            } 
        }
    }

    /**
     * Ajoute dans la map le bouton au joueur qui a cliqu� dessus
     * @param actionCommand
     * @param JOUEUR_1
     */
    public void setBoutonAJoueur(String actionCommand, int joueur) {
        //On r�cupere les boutonw
        List<JButton> l = boutonsUtilParJoueur.get(joueur);
        for (JButton jb : listBoutonScore) {
            if (jb.getActionCommand().equals(actionCommand)) {
                l.add(jb);
            }
        }
        boutonsUtilParJoueur.put(joueur, l);

    }

    /**
     * Degirse le bouton de l'action command correspndant.
     * @param i
     */
    public void deverrouilleBouton(String ac) {
        for (JButton jb : listBoutonDes) {
            if (jb.getActionCommand().equals(ac)) {
                jb.setBorderPainted(false);
            }
        }
    }

    /************* Méthode d'écriture *****************/

    public void setTextScoreSommeUn(String s) {
        lbl_As.setText(s);
    }

    public void setTextScoreSommeDeux(String s) {
        lbl_Deux.setText(s);
    }

    public void setTextScoreSommeTrois(String s) {
        lbl_Trois.setText(s);
    }

    public void setTextScoreSommeQuatre(String s) {
        lbl_Quatre.setText(s);
    }

    public void setTextScoreSommeCinq(String s) {
        lbl_Cinq.setText(s);
    }

    public void setTextScoreSommeSix(String s) {
        lbl_Six.setText(s);
    }

    public void setTextScoreBrelan(String s) {
        lbl_Brelan.setText(s);
    }

    public void setTextScoreCarre(String s) {
        lbl_Carre.setText(s);
    }

    public void setTextScoreFull(String s) {
        lbl_Full.setText(s);
    }

    public void setTextScorePetiteSuite(String s) {
        lbl_PetiteSuite.setText(s);
    }

    public void setTextScoreGrandeSuite(String s) {
        lbl_GrandeSuite.setText(s);
    }

    public void setTextScoreChance(String s) {
        lbl_Chance.setText(s);
    }

    public void setTextScoreYams(String s) {
        lbl_Yams.setText(s);
    }

    /**
     * Méthode qui vérifie l'ensemble des boutons/dés sélectionnés et renvoit leurs valeurs,
     * @return List contenant les valeurs des d�s s�lectionn�s
     */
    public List<Integer> getValeurDesSelect() {
        List<Integer> l = new ArrayList<Integer>();
        for (JButtonDe jb : listBoutonDes) {
            if (!jb.isEnabled()) {
                l.add(jb.getValeur());
            }
        }
        return l;
    }

    /**
     * Change l'affichage pour indiquer que c'est au joueur suivant de prendre
     * la main
     * @param joueur
     */
    public void auTourDe(int joueur) {
        List<JButton> listBtns;
        //Selon le joueur qui jouer
        //on modifie l'affichage
        if (joueur == JOUEUR_1) {
            lbl_Joueur1.setForeground(COULEUR_JOUEUR_ACTIF);
            lbl_ScoreJoueur1.setForeground(COULEUR_JOUEUR_ACTIF);
            lbl_Joueur2.setForeground(COULEUR_JOUEUR_ATTENTE);
            lbl_ScoreJoueur2.setForeground(COULEUR_JOUEUR_ATTENTE);
            listBtns = boutonsUtilParJoueur.get(JOUEUR_2);
            //On réactive tout les boutons
            for (JButton jb : listBtns) {
                jb.setEnabled(true);
            }
            //On désactive les combinaisons déjà effectuées
            listBtns = boutonsUtilParJoueur.get(JOUEUR_1);
            for (JButton jb : listBtns) {
                jb.setEnabled(false);
            }
        } else if (joueur == JOUEUR_2) {
            lbl_Joueur2.setForeground(COULEUR_JOUEUR_ACTIF);
            lbl_ScoreJoueur2.setForeground(COULEUR_JOUEUR_ACTIF);
            lbl_Joueur1.setForeground(COULEUR_JOUEUR_ATTENTE);
            lbl_ScoreJoueur1.setForeground(COULEUR_JOUEUR_ATTENTE);
            listBtns = boutonsUtilParJoueur.get(JOUEUR_1);
            for (JButton jb : listBtns) {
                jb.setEnabled(true);
            }
            listBtns = boutonsUtilParJoueur.get(JOUEUR_2);
            for (JButton jb : listBtns) {
                jb.setEnabled(false);
            }
            
        }

        //Réinitialisation des scores
        reinitialiseScores();
        
        //On enlève les dés
        for (JButtonDe jb : listBoutonDes) {
            jb.setBorderPainted(false);
            jb.setVisible(false);
        }
        lbl_NbLancersRestants.setText("3");
    }

    /**
     * Mets à jour l'affichage du score d'un joueur
     * @param joueur
     * @param score
     */
    public void setScoreJoueur(int joueur, Integer score) {
        if (joueur == JOUEUR_1) {
            lbl_ScoreJoueur1.setText(score.toString());
        } else {
            lbl_ScoreJoueur2.setText(score.toString());
        }
    }

    /**
     * Méthode qui réinitialise l'affichage des scores
     */
    public void reinitialiseScores() {
        lbl_Brelan.setText("0");
        lbl_Carre.setText("0");
        lbl_Full.setText("0");
        lbl_Yams.setText("0");
        lbl_GrandeSuite.setText("0");
        lbl_PetiteSuite.setText("0");
        lbl_As.setText("0");
        lbl_Deux.setText("0");
        lbl_Trois.setText("0");
        lbl_Quatre.setText("0");
        lbl_Cinq.setText("0");
        lbl_Six.setText("0");
        lbl_Chance.setText("0");
    }

    /**
     * Méthode qui affiche l'erreur d'une combinaison inconnue
     */
    public void afficheErreurCombiInconnu() {
        System.err.println("Erreur: combinaison inconnue");
    }

    private String cheminCompletFichier(String image) {
        String directory = "img";
        String os = System.getProperty("os.name").toLowerCase();
        String cheminFichier = "";
        //Si l'OS est Windows on ajoute un caract�re '\' entre
        //le r�pertoire et le fichier
        if ((os.indexOf("win") >= 0)) {
            cheminFichier = directory + "\\" + image;
        } //Si c'est MAC OS ou Unix/Linux on ajoute un caract�re '/'
        else {
            cheminFichier = directory + "/" + image;
        }
        return cheminFichier;
    }


    private String directoryDes() {
        String os = System.getProperty("os.name").toLowerCase();
        String directory = "";
        if ((os.indexOf("win") >= 0)) {
            directory = "img" + "\\" + "numbers" + "\\";
        } //Si c'est MAC OS ou Unix/Linux on ajoute un caract�re '/'
        else {
            directory = "img" + "/" + "numbers" + "/";
        }
        return directory;
    }

    /**
     * Méthode qui retourne l'action event du bouton correspondant à un action command
     * @param actionCommand correspondant au bouton sur lequel on veux cliquer
     * @return un ActionEvent associé a l'action command.
     */
    public ActionEvent getActionEvent(String actionCommand) {
        JButton btnSource = new JButton();
        for (JButton btnTemp : listBoutonScore) {
            if (btnTemp.getActionCommand().equals(actionCommand)) {
                btnSource = btnTemp;
                break;
            }
        }
        return new ActionEvent(btnSource, 0, btnSource.getActionCommand());
    }

    /**
     * Affiche une erreur (click sur les scores avant de lancers les dés)
     */
    public void afficheErreurScoreAvantLancer() {
        JOptionPane.showMessageDialog(this, getBundle().getString("erreur_score_de"),
                getBundle().getString("erreur"), JOptionPane.WARNING_MESSAGE);
    }

    /**
     * Méthode qui traite l'affichage de la fin de la partie
     * @param codeJoueur
     */
    public void afficheFinDePartie(int codeJoueur) {
        String message = "";
        String nomVainqueur = "";
        if (codeJoueur == 0) {
            message = bundle.getString("nul");
        } else {
            if (codeJoueur == JOUEUR_1) {
                nomVainqueur = nomJ1;
            } else {
                nomVainqueur = nomJ2;
            }
            message = bundle.getString("vainqueur") + " " + nomVainqueur;
        }
        JOptionPane.showMessageDialog(this, message);

        btn_LancerDes.setEnabled(false);
    }

    /**
     * Methode qui affiche une jDialog pour demander confirmation à l'utilisateur
     * s'il veut quitter la parter
     * @return le code retour de la jdialog 0 si l'utilisateur à confirmé
     */
    public int afficheDemandeQuitterPartie() {
        return JOptionPane.showConfirmDialog(this, bundle.getString("quitter_partie"));
    }
}
